package org.jeecg.common.util;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;

/** @Author 张代浩 */
public class BrowserUtils {

  // 判断是否是IE
  public static boolean isIE(HttpServletRequest request) {
    return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0
            || request.getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0)
        ? true
        : false;
  }

  /**
   * 获取IE版本
   *
   * @param request
   * @return
   */
  public static Double getIEversion(HttpServletRequest request) {
    Double version = 0.0;
    if (getBrowserType(request, IE11)) {
      version = 11.0;
    } else if (getBrowserType(request, IE10)) {
      version = 10.0;
    } else if (getBrowserType(request, IE9)) {
      version = 9.0;
    } else if (getBrowserType(request, IE8)) {
      version = 8.0;
    } else if (getBrowserType(request, IE7)) {
      version = 7.0;
    } else if (getBrowserType(request, IE6)) {
      version = 6.0;
    }
    return version;
  }

  /**
   * 获取浏览器类型
   *
   * @param request
   * @return
   */
  public static BrowserType getBrowserType(HttpServletRequest request) {
    BrowserType browserType = null;
    if (getBrowserType(request, IE11)) {
      browserType = BrowserType.IE11;
    }
    if (getBrowserType(request, IE10)) {
      browserType = BrowserType.IE10;
    }
    if (getBrowserType(request, IE9)) {
      browserType = BrowserType.IE9;
    }
    if (getBrowserType(request, IE8)) {
      browserType = BrowserType.IE8;
    }
    if (getBrowserType(request, IE7)) {
      browserType = BrowserType.IE7;
    }
    if (getBrowserType(request, IE6)) {
      browserType = BrowserType.IE6;
    }
    if (getBrowserType(request, FIREFOX)) {
      browserType = BrowserType.Firefox;
    }
    if (getBrowserType(request, SAFARI)) {
      browserType = BrowserType.Safari;
    }
    if (getBrowserType(request, CHROME)) {
      browserType = BrowserType.Chrome;
    }
    if (getBrowserType(request, OPERA)) {
      browserType = BrowserType.Opera;
    }
    if (getBrowserType(request, "Camino")) {
      browserType = BrowserType.Camino;
    }
    return browserType;
  }

  private static boolean getBrowserType(HttpServletRequest request, String brosertype) {
    return request.getHeader("USER-AGENT").toLowerCase().indexOf(brosertype) > 0 ? true : false;
  }

  private static final String IE11 = "rv:11.0";
  private static final String IE10 = "MSIE 10.0";
  private static final String IE9 = "MSIE 9.0";
  private static final String IE8 = "MSIE 8.0";
  private static final String IE7 = "MSIE 7.0";
  private static final String IE6 = "MSIE 6.0";
  private static final String MAXTHON = "Maxthon";
  private static final String QQ = "QQBrowser";
  private static final String GREEN = "GreenBrowser";
  private static final String SE360 = "360SE";
  private static final String FIREFOX = "Firefox";
  private static final String OPERA = "Opera";
  private static final String CHROME = "Chrome";
  private static final String SAFARI = "Safari";
  private static final String OTHER = "其它";

  public static String checkBrowse(HttpServletRequest request) {
    String userAgent = request.getHeader("USER-AGENT");
    if (regex(OPERA, userAgent)) {
      return OPERA;
    }
    if (regex(CHROME, userAgent)) {
      return CHROME;
    }
    if (regex(FIREFOX, userAgent)) {
      return FIREFOX;
    }
    if (regex(SAFARI, userAgent)) {
      return SAFARI;
    }
    if (regex(SE360, userAgent)) {
      return SE360;
    }
    if (regex(GREEN, userAgent)) {
      return GREEN;
    }
    if (regex(QQ, userAgent)) {
      return QQ;
    }
    if (regex(MAXTHON, userAgent)) {
      return MAXTHON;
    }
    if (regex(IE11, userAgent)) {
      return IE11;
    }
    if (regex(IE10, userAgent)) {
      return IE10;
    }
    if (regex(IE9, userAgent)) {
      return IE9;
    }
    if (regex(IE8, userAgent)) {
      return IE8;
    }
    if (regex(IE7, userAgent)) {
      return IE7;
    }
    if (regex(IE6, userAgent)) {
      return IE6;
    }
    return OTHER;
  }

  public static boolean regex(String regex, String str) {
    Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
    Matcher m = p.matcher(str);
    return m.find();
  }

  private static Map<String, String> langMap = new HashMap<String, String>();
  private static final String ZH = "zh";
  private static final String ZH_CN = "zh-cn";

  private static final String EN = "en";
  private static final String EN_US = "en";

  static {
    langMap.put(ZH, ZH_CN);
    langMap.put(EN, EN_US);
  }

  public static String getBrowserLanguage(HttpServletRequest request) {

    String browserLang = request.getLocale().getLanguage();
    String browserLangCode = (String) langMap.get(browserLang);

    if (browserLangCode == null) {
      browserLangCode = EN_US;
    }
    return browserLangCode;
  }

  /** 判断请求是否来自电脑端 */
  public static boolean isDesktop(HttpServletRequest request) {
    return !isMobile(request);
  }

  /** 判断请求是否来自移动端 */
  public static boolean isMobile(HttpServletRequest request) {
    String ua = request.getHeader("User-Agent").toLowerCase();
    Pattern pattern =
        Pattern.compile(
            "(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windows phone)");
    return pattern.matcher(ua).find();
  }
}
